跳到主要内容

V2Ray 使用方式

V2Ray 简介

SSR: Shadowsocks 现在已经被嗅探出特征了,基本不可用了 v2ray: V2Ray 与 Shadowsocks/ShadowsocksR 一样,都是科学上网代理工具。

V2Ray 与 SS、SSR 的区别 Shadowsocks 是一个简单易用的代理工具,而 V2Ray 是一个开发平台,所有的开发者都可以使用 V2Ray 研发的模块开发新的翻墙工具。

具体来说,相比 SS/SSR,V2Ray 有以下特点和优势: ● 多入口多出口:一个 V2Ray 进程可并发支持多个入站和出站协议,每个协议可独立工作。 ● 可定制化路由:入站流量可按配置由不同的出口发出。轻松实现按区域或按域名分流,以达到最优的网络性能。 ● 多协议支持:V2Ray 可同时开启多个协议支持,包括 Socks、HTTP、Shadowsocks、VMess 等。每个协议可单独设置传输载体,比如 TCP、mKCP、WebSocket 等。 ● 隐蔽性:V2Ray 的节点可以伪装成正常的网站(HTTPS),将其流量与正常的网页流量混淆,以避开第三方干扰。 ● 反向代理:通用的反向代理支持,可实现内网穿透功能。 ● 多平台支持:原生支持所有常见平台,如 Windows、Mac OS、安卓、苹果手机、Linux,并有众多第三方支持移动平台。

提示

VMess 是一个加密传输协议,它分为入站和出站两部分,通常作为 V2Ray 客户端和服务器之间的桥梁。内部基于 TCP 的协议,所有数据使用 TCP 传输

安装

mkdir v2ray && cd v2ray
wget https://github.com/v2fly/v2ray-core/releases/download/v5.7.0/v2ray-linux-64.zip
apt install unzip
unzip v2ray-linux-64.zip
rm v2ray-linux-64.zip

或者

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

V2Ctl 是什么?

V2Ctl 是一个集合

  • api: 调用 V2Ray 进程的远程控制指令。
  • config: 从标准输入读取 JSON 格式的配置,然后从标准输出打印 Protobuf 格式的配置。
  • cert: 生成 TLS 证书。
  • fetch: 抓取远程文件。
  • tlsping: (V2Ray 4.17+) 尝试进行 TLS 握手。
  • verify: 验证文件是否由 Project V 官方签名。
  • uuid: 输出一个随机的 UUID。

V2Ray 配置格式

Linux 有一个软件叫 jq,可以执行这样的指令检查配置文件的语法是否正确:

jq . config.json

V2Ray 提供的配置检查功能(test 选项),因为可以检查 JSON 语法错误外的问题,比如说突然间手抖把 vmess 写成了 vmss,一下子就检查出来了。

v2ray -test -config /etc/v2ray/config.json

无论是客户端还是服务器,配置文件都由两部分内容组成: inbounds 和 outbounds。

V2Ray 没有使用常规代理软件的 C/S(即客户端/服务器)结构,它既可以当做服务器也可以作为客户端。于是我们可以从另一个角度来理解,认为每一个 V2Ray 都是一个节点,inbound 是关于如何与上一个节点连接的配置,outbound 是关于如何与下一个节点连接的配置。对于第一个节点,inbound 与浏览器连接;对于最后一个节点,outbound与目标网站连接。inbounds 和 outbounds 是 inbound 和 outbound 的集合,意味着每一个 V2Ray 节点都可以有多个入口和出口。

下面只是简单介绍各个配置,平时可以靠 网站 生成配置

启动服务

sudo mkdir /usr/local/bin/v2ray 
sudo ln -s /home/alsritter/v2ray /usr/local/bin/v2ray
sudo cp /home/alsritter/v2ray/config.json /etc/v2ray/config.json
sudo cp /home/alsritter/v2ray/systemd/system/v2ray.service /etc/systemd/system/
sudo systemctl daemon-reload

# 第一次执行
sudo systemctl enable v2ray

# 之后执行
sudo systemctl start v2ray

sudo systemctl status v2ray

# 测试
export HTTP_PROXY="http://192.168.1.1:10809"
export HTTPS_PROXY="http://192.168.1.1:10809"
wget --proxy=on --http-proxy="http://192.168.1.1:10809" https://google.com

客户端配置

以下是客户端配置,将客户端的 config.json 文件修改成下面的内容,修改完成后要重启 V2Ray 才会使修改的配置生效。

{
"inbounds": [
{
"port": 1080, // 监听端口
"protocol": "socks", // 入口协议为 SOCKS 5
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth" //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
}
}
],
"outbounds": [
{
"protocol": "vmess", // 出口协议
"settings": {
"vnext": [
{
"address": "serveraddr.com", // 服务器地址,请修改为你自己的服务器 IP 或域名
"port": 16823, // 服务器端口
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811", // 用户 ID,必须与服务器端配置相同
"alterId": 64 // 此处的值也应当与服务器相同
}
]
}
]
}
}
]
}

在配置当中,有一个 id (在这里的例子是 b831381d-6324-4d53-ad4f-8cda48b30811),作用类似于 Shadowsocks 的密码(password), VMess 的 id 的格式必须与 UUID 格式相同。

  • 相对应的 VMess 传入传出的 id 必须相同(服务器与客户端的 id 必须相同)
  • 由于 id 使用的是 UUID 的格式,我们可以使用任何 UUID 生成工具生成 UUID 作为这里的 id

这里的配置作用:

  • 客户端配置中的 inbounds,port 为 1080,即 V2Ray 监听了一个端口 1080,协议是 socks
  • 再看 outbounds,protocol 是 vmess,说明 V2Ray 接收到数据包之后要将数据包打包成 VMess 协议并且使用预设的 id 加密(这个例子 id 是 b831381d-6324-4d53-ad4f-8cda48b30811),然后发往服务器地址为 serveraddr.com 的 16823 端口。服务器地址 address 可以是域名也可以是 IP,只要正确就可以了。

在客户端配置的 inbounds 中,有一个 "sniffing" 字段,V2Ray 手册解释为“流量探测,根据指定的流量类型,重置所请求的目标”,这话不太好理解,简单说这东西就是从网络流量中识别出域名。这个 sniffing 有两个用处:

  • 解决 DNS 污染;
  • 对于 IP 流量可以应用后文提到的域名路由规则;

服务端配置

以下是服务器配置,将服务器 /etc/v2ray 目录下的 config.json 文件修改成下面的内容,修改完成后要重启 V2Ray 才会使修改的配置生效。

{
"inbounds": [
{
"port": 16823, // 服务器监听端口
"protocol": "vmess", // 主传入协议
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811", // 用户 ID,客户端与服务器必须相同
"alterId": 64
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom", // 主传出协议
"settings": {}
}
]
}

接着看服务器,服务器配置的 id 是 b831381d-6324-4d53-ad4f-8cda48b30811,所以 V2Ray 服务器接收到客户端发来的数据包时就会尝试用 b831381d-6324-4d53-ad4f-8cda48b30811 解密,如果解密成功再看一下时间对不对,对的话就把数据包发到 outbound 去,outbound.protocol 是 freedom(freedom 的中文意思是自由,在这里姑且将它理解成直连吧),数据包就直接发到 google.com 了。

实际上数据包的流向就是:

{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(VMess)-->  {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

配置中还有一个 alterId 参数,这个参数主要是为了加强防探测能力。理论上 alterId 越大越好,但越大就约占内存(只针对服务器,客户端不占内存),所以折中之下设一个中间值才是最好的。那么设多大才是最好的?其实这个是分场景的,我没有严格测试过这个,不过根据经验,alterId 的值设为 30 到 100 之间应该是比较合适的。alterId 的大小要保证客户端的小于等于服务器的。

k8s 部署代理节点

因为在 k8s 里面部署的 pod 之间是可以互相访问的,所以我们可以在 k8s 里面部署一个代理节点,然后让其他的 pod 通过这个代理节点来访问外网

首先,构建一个 v2ray 的镜像

FROM debian:buster-slim

# 设置工作目录
WORKDIR /usr/src/app

# 将本地文件复制到容器内
COPY . .

# 设置环境变量,例如配置文件路径
ENV V2RAY_CONFIG=/usr/src/app/config.json

# 暴露v2ray使用的端口
EXPOSE 1080 1081

# 设置启动命令
CMD ["./v2ray", "run", "-config", "/usr/src/app/config.json"]
docker build -t 192.168.1.1:58180/baseimage/v2ray:v1.0.0 .
docker push 192.168.1.1:58180/baseimage/v2ray:v1.0.0

创建 v2ray 的配置文件,假设文件名为 v2ray-config.json

{
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"udp": true
}
},
{
"port": 1081,
"protocol": "http",
"settings": {
"timeout": 0
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

这个配置文件定义了两个入站协议,一个是运行在1080端口的Socks代理,另一个是运行在1081端口的HTTP代理。出站协议是直连。

然后,将v2ray配置文件保存到Kubernetes ConfigMap中:

kubectl create configmap -n common-namespace v2ray-config --from-file=config.json

接下来,创建一个名为 v2ray-deployment.yaml 的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: v2ray-proxy
namespace: common-namespace
spec:
replicas: 1
selector:
matchLabels:
app: v2ray-proxy
template:
metadata:
labels:
app: v2ray-proxy
spec:
containers:
- name: v2ray-proxy
image: 192.168.1.1:58180/baseimage/v2ray:v1.0.0
ports:
- containerPort: 1080 # 注意需要和配置文件中的端口一致
- containerPort: 1081
volumeMounts:
- name: v2ray-config
mountPath: /usr/src/app/config.json
subPath: config.json
resources:
limits:
memory: "256Mi"
cpu: "200m"
volumes:
- name: v2ray-config
configMap:
name: v2ray-config

这个 Deployment 配置将创建一个包含 v2ray 代理服务器的 Pod,并挂载 ConfigMap 到容器的 /etc/v2ray/config.json 路径。

最后,创建一个名为 v2ray-service.yaml 的文件,内容如下:

apiVersion: v1
kind: Service
metadata:
name: v2ray-proxy-service
namespace: common-namespace
spec:
selector:
app: v2ray-proxy
ports:
- name: socks
protocol: TCP
port: 1080
targetPort: 1080
- name: http
protocol: TCP
port: 1081
targetPort: 1081

这个Service配置将创建一个名为 v2ray-proxy-service 的 Service,它将流量路由到标有 app: v2ray-proxy 标签的 Pods 上的 1080 和 1081 端口。

你可以使用 kubectl apply 命令来创建这些资源:

kubectl apply -f v2ray-deployment.yaml
kubectl apply -f v2ray-service.yaml

创建完这些资源后,其他Pod可以通过访问 v2ray-proxy-service:1080 来使用 Socks 代理,或者通过访问 v2ray-proxy-service:1081 来使用 HTTP 代理。

export HTTP_PROXY="http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"
export HTTPS_PROXY="http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"

Reference